/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Pojo.Aluno;
import Pojo.Atividade;
import Pojo.Nota;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author Thiago Schons
 */
public class NotaDaoImplJPA implements NotaDao{
    
            /**
	 * Adicionar uma Nota ao banco de dados de Notas
	 * @param nota
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean inserir(Nota nota){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.persist(nota);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
         /**
	 * Remover Nota do banco de dados de Notas
	 * @param nota
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean remover(Nota nota){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                Nota notaAux = em.find(Nota.class, nota.getId());
                em.remove(notaAux);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
         /**
	 * alterar Nota do banco de dados de Notas
	 * @param nota
	 * @return true ou false indicando sucesso ou não
	 */
         public boolean alterar(Nota nota){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.merge(nota);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
         }
         
         public List<Nota> pesquisarPorAtividade(Atividade atividade){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Nota> listaNotas = null;
            try{
                tx.begin();
                Query query = em.createQuery("select n from Nota n where n.atividade= :atividade");
                query.setParameter("atividade", atividade);
                listaNotas = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaNotas);
         }
 
         public Nota pesquisarNota(Aluno aluno, Atividade atividade){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            Nota nota=null;
            try{
                tx.begin();
                Query query = em.createQuery("select n from Nota n where n.aluno= :aluno and n.atividade = :atividade");
                query.setParameter("aluno",aluno);
                query.setParameter("atividade",atividade);
                nota = (Nota) query.getSingleResult();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(nota);
         }
         
        /**
         * Pesquisa notas pelo id
         * @param id
         * @return Nota encontrada na busca
         */
        public Nota pesquisarPorId(int id){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            Nota nota=null;
            try{
                tx.begin();
                Query query = em.createQuery("select d from Nota d where d.id= :id");
                query.setParameter("id",id);
                nota = (Nota) query.getSingleResult();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(nota);
        }
        
        
        /**
	 * Pesquisa notas pelo id
	 * @param id
	 * @return Nota encontrada na busca
	 */
	public int verificarLancamento(Aluno aluno, Atividade atividade){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            Nota nota = null;
            try{
                tx.begin();
                Query query = em.createQuery("select n from Nota n where n.aluno= :aluno and n.atividade= :atividade");
                query.setParameter("aluno", aluno);
                query.setParameter("atividade", atividade);
                nota = (Nota) query.getSingleResult();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(0);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            if (nota==null) {
                return(0);
            }else{
                return(1);
            }         
        }
}